home *** CD-ROM | disk | FTP | other *** search
/ Chip: Special XP & Vista / Chip Spesial XP & Vista.iso / 1_Audio_Video / MediaCoder / MediaCoder-0.6.1.4098.exe / extensions / _include / xmlrpc.js < prev   
Text File  |  2008-02-21  |  8KB  |  291 lines

  1. /*
  2.  
  3. xmlrpc.js beta version 1
  4. Tool for creating XML-RPC formatted requests in JavaScript
  5.  
  6. Copyright 2001 Scott Andrew LePera
  7.  
  8. scott@scottandrew.com
  9. http://www.scottandrew.com/xml-rpc
  10.  
  11. Copyright 2008 Stanley Huang
  12. stanleyhuangyc@gmail.com
  13.  
  14. License: 
  15. You are granted the right to use and/or redistribute this 
  16. code only if this license and the copyright notice are included 
  17. and you accept that no warranty of any kind is made or implied 
  18. by the author.
  19.  
  20. */
  21.  
  22. function XMLRPCMessage(methodname){
  23.   this.method = methodname||"system.listMethods";
  24.   this.params = [];
  25.   this.paramNames = [];
  26.   return this;
  27. }
  28.  
  29. XMLRPCMessage.prototype.setMethod = function(methodName){
  30.   if (!methodName) return;
  31.   this.method = methodName;
  32. }
  33.  
  34. XMLRPCMessage.prototype.addParameter = function(data, name){
  35.   if (arguments.length==0) return;
  36.   this.params[this.params.length] = data;
  37.   this.paramNames[this.paramNames.length] = name ? name : null;
  38. }
  39.  
  40. XMLRPCMessage.prototype.xml = function(){
  41.  
  42.   var method = this.method;
  43.   
  44.   // assemble the XML message header
  45.   var xml = "";
  46.   
  47.   xml += "<?xml version=\"1.0\"?>\n";
  48.   xml += "<methodCall>\n";
  49.   xml += "<methodName>" + method+ "</methodName>\n";
  50.   xml += "<params>\n";
  51.   
  52.   // do individual parameters
  53.   for (var i = 0; i < this.params.length; i++){
  54.     var name = this.paramNames[i];
  55.     var data = this.params[i];
  56.     xml += "<param>\n";
  57.     if (name) xml += "<name>" + name + "</name>\n";
  58.     xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data),data) + "</value>\n";
  59.     
  60.     xml += "</param>\n";
  61.   }
  62.   
  63.   xml += "</params>\n";
  64.   xml += "</methodCall>";
  65.   
  66.   return xml; // for now
  67. }
  68.  
  69. XMLRPCMessage.dataTypeOf = function (o){
  70.   // identifies the data type
  71.   var type = typeof(o);
  72.   type = type.toLowerCase();
  73.   switch(type){
  74.     case "number":
  75.       if (Math.round(o) == o) type = "i4";
  76.       else type = "double";
  77.       break;
  78.     case "object":
  79.       var con = o.constructor;
  80.       if (con == Date) type = "date";
  81.       else if (con == Array) type = "array";
  82.       else type = "struct";
  83.       break;
  84.   }
  85.   return type;
  86. }
  87.  
  88. XMLRPCMessage.doValueXML = function(type,data){
  89.   var xml = "<" + type + ">" + data + "</" + type + ">";
  90.   return xml;
  91. }
  92.  
  93. XMLRPCMessage.doBooleanXML = function(data){
  94.   var value = (data==true)?1:0;
  95.   var xml = "<boolean>" + value + "</boolean>";
  96.   return xml;
  97. }
  98.  
  99. XMLRPCMessage.doDateXML = function(data){
  100.   var xml = "<dateTime.iso8601>";
  101.   xml += dateToISO8601(data);
  102.   xml += "</dateTime.iso8601>";
  103.   return xml;
  104. }
  105.  
  106. XMLRPCMessage.doArrayXML = function(data){
  107.   var xml = "<array><data>\n";
  108.   for (var i = 0; i < data.length; i++){
  109.     xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data[i]),data[i]) + "</value>\n";
  110.   }
  111.   xml += "</data></array>\n";
  112.   return xml;
  113. }
  114.  
  115. XMLRPCMessage.doStructXML = function(data){
  116.   var xml = "<struct>\n";
  117.   for (var i in data){
  118.     xml += "<member>\n";
  119.     xml += "<name>" + i + "</name>\n";
  120.     xml += "<value>" + XMLRPCMessage.getParamXML(XMLRPCMessage.dataTypeOf(data[i]),data[i]) + "</value>\n";
  121.     xml += "</member>\n";
  122.   }
  123.   xml += "</struct>\n";
  124.   return xml;
  125. }
  126.  
  127. XMLRPCMessage.getParamXML = function(type,data){
  128.   var xml;
  129.   switch (type){
  130.     case "date":
  131.       xml = XMLRPCMessage.doDateXML(data);
  132.       break;
  133.     case "array":
  134.       xml = XMLRPCMessage.doArrayXML(data);
  135.       break;
  136.     case "struct":
  137.       xml = XMLRPCMessage.doStructXML(data);
  138.       break;
  139.       case "boolean":
  140.       xml = XMLRPCMessage.doBooleanXML(data);
  141.       break;
  142.     default:
  143.       xml = XMLRPCMessage.doValueXML(type,data);
  144.       break;
  145.   }
  146.   return xml;
  147. }
  148.  
  149. function dateToISO8601(date){
  150.   // wow I hate working with the Date object
  151.   var year = new String(date.getYear());
  152.   var month = leadingZero(new String(date.getMonth()));
  153.   var day = leadingZero(new String(date.getDate()));
  154.   var time = leadingZero(new String(date.getHours())) + ":" + leadingZero(new String(date.getMinutes())) + ":" + leadingZero(new String(date.getSeconds()));
  155.  
  156.   var converted = year+month+day+"T"+time;
  157.   return converted;
  158.   
  159. function leadingZero(n){
  160.   // pads a single number with a leading zero. Heh.
  161.   if (n.length==1) n = "0" + n;
  162.   return n;
  163. }
  164.  
  165. function getValue(xmlval)
  166. {
  167.     var v = getChildNode(xmlval);
  168.     var ret = getNodeValue(v);
  169.     switch (v.nodeName) {
  170.     case "boolean":
  171.         return ret == "1";
  172.     case "int":
  173.     case "i4":
  174.         return parseInt(ret, 10);
  175.     case "double":
  176.         return parseFloat(ret);
  177.     case "string":
  178.     case "date":
  179.         return ret;
  180.     case "struct":
  181.         vals = v.getElementsByTagName("member");
  182.         var result = new Array;
  183.         for (var x = 0; x < vals.length; x++) {
  184.             var name = getChildNodeValue(vals[x], "name");
  185.             var v = findChildNode(vals[x], "value");
  186.             result[name] = getValue(v);
  187.         }
  188.         return result;
  189.     }
  190.     return null;
  191. }
  192.  
  193. function parseRPC(xml)
  194. {
  195.     // retrieve return value
  196.     if (!xml) return null;
  197.     var vals = xml.getElementsByTagName("value");
  198.     if (vals.length > 0) {
  199.         return getValue(vals[0]);
  200.     } else {
  201.         return null;    
  202.     }
  203. }
  204.  
  205. function getRPCPayload(method)
  206. {
  207.     var msg = new XMLRPCMessage();
  208.     msg.setMethod(method);
  209.     for(var i=1; i<arguments.length; i++) {
  210.         msg.addParameter(arguments[i]);
  211.     }
  212.     return msg.xml();
  213. }
  214.  
  215. var xmlrpcurl = "/xmlrpc";
  216.  
  217. function callRPC(method)
  218. {
  219.     var url = xmlrpcurl;
  220.     var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest : new ActiveXObject("Microsoft.XMLHTTP");
  221.     if (!xmlhttp) return -1;
  222.  
  223.     var msg = new XMLRPCMessage();
  224.     msg.setMethod(method);
  225.     for(var i=1; i<arguments.length; i++) {
  226.         msg.addParameter(arguments[i]);
  227.     }
  228.  
  229.     try { 
  230.         xmlhttp.open("POST", url, false);
  231.         xmlhttp.send(msg.xml());
  232.     }
  233.     catch (ex) {
  234.         alert(ex);
  235.     }
  236.     return parseRPC(xmlhttp.responseXML);
  237. }
  238.  
  239. function addHTML (html) {
  240.   if (document.all)
  241.     document.body.insertAdjacentHTML('beforeEnd', html);
  242.   else if (document.createRange) {
  243.     var range = document.createRange();
  244.     range.setStartAfter(document.body.lastChild);
  245.     var docFrag = range.createContextualFragment(html);
  246.     document.body.appendChild(docFrag);
  247.   }
  248.   else if (document.layers) {
  249.     var l = new Layer(window.innerWidth);
  250.     l.document.open();
  251.     l.document.write(html);
  252.     l.document.close();
  253.     l.top = document.height;
  254.     document.height += l.document.height;
  255.   }
  256. }
  257.  
  258. var userCallback = null;
  259.  
  260. function callbackRPC(method, response)
  261. {
  262.     if (!userCallback) return;
  263.     if (response.XMLDocument) {
  264.         var node = response.XMLDocument.getElementsByTagName("methodResponse");
  265.         if (node.length > 0)
  266.             userCallback(method, parseRPC(node[0]));
  267.     } else {
  268.         if (response.firstChild.nodeName == "methodResponse") {
  269.             userCallback(method, parseRPC(response));
  270.         }
  271.     }
  272. }
  273.  
  274. function postRPC(url, callback, method)
  275. {
  276.     if (!document.getElementById("rpcform")) {
  277.         addHTML("<div style='display:none'><form id='rpcform' method='post' action='"+url+"' target='rpcframe' enctype='text/plain'><textarea name='rpcpayload'></textarea></form><iframe id='rpcframe' name='rpcframe' onload=\"callbackRPC('"+method+"', window.frames['rpcframe'].document)\"></iframe></div>");
  278.     }
  279.     var msg = new XMLRPCMessage();
  280.     msg.setMethod(method);
  281.     for(var i=3; i<arguments.length; i++) {
  282.         msg.addParameter(arguments[i]);
  283.     }
  284.     var frm = document.getElementById("rpcform");
  285.     if (!frm) return false;
  286.     frm.rpcpayload.value = msg.xml();
  287.     userCallback = callback;
  288.     frm.submit();
  289.     return true;
  290. }